package com.dhsc.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import lombok.extern.slf4j.Slf4j;

/**
 * 托管部报表 函数
 * Arith  
 * 陈龙 - chenlong@sys-test.com.cn   
 * 2018年6月8日 上午11:10:40
 */
@Slf4j
public class Arith {

	private Arith()
	{

	}
	
	/**
	 * 两个Double数相加，并保留2位小数
	 * add   
	 * @param v1
	 * @param v2
	 * @return   
	 * Double  
	 * 陈龙 - chenlong@sys-test.com.cn 
	 * 2018年6月8日-上午11:11:16
	 */
    public static Double add(Double v1,Double v2){
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        double result =  b1.add(b2).doubleValue();
        if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 三个Double数相加，并保留2位小数
     * threeadd   
     * @param v1
     * @param v2
     * @param v3
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:11:25
     */
    public static Double threeadd(Double v1,Double v2,Double v3){
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        BigDecimal b3 = new BigDecimal(v3.toString());
        double result =  b1.add(b2).add(b3).doubleValue();
        if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 四个Double数相加，并保留2位小数
     * fouradd   
     * @param v1
     * @param v2
     * @param v3
     * @param v4
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:11:31
     */
    public static Double fouradd(Double v1,Double v2,Double v3,Double v4){
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        BigDecimal b3 = new BigDecimal(v3.toString());
        BigDecimal b4 = new BigDecimal(v4.toString());
        double result =  b1.add(b2).add(b3).add(b4).doubleValue();
        if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 两个Double数相减，并保留2位小数
     * sub   
     * @param v1
     * @param v2
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:11:41
     */
    public static Double sub(Double v1,Double v2){
    	BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
    	double result = b1.subtract(b2).doubleValue();
  		if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 三个Double数相减，并保留2位小数
     * threesub   
     * @param v1
     * @param v2
     * @param v3
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:11:51
     */
    public static Double threesub(Double v1,Double v2,Double v3){
    	BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        BigDecimal b3 = new BigDecimal(v3.toString());
    	double result = b1.subtract(b2).subtract(b3).doubleValue();
  		if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 两个Double数相乘，并保留2位小数
     * mul   
     * @param v1
     * @param v2
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:11:57
     */
    public static Double mul(Double v1,Double v2){
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        double result = b1.multiply(b2).doubleValue();
        if(result!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			return Double.parseDouble(df.format(result));
  		}else{
  			return 0.00;
  		}
    }
    
    /**
     * 两个Double数相除，并保留2位小数
     * div   
     * @param v1
     * @param v2
     * @return   
     * Double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:12:04
     */
    public static Double div(Double v1,Double v2){
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    
    /**
     * excel  max函数
     * max   
     * @param val
     * @return   
     * double  
     * 陈龙 - chenlong@sys-test.com.cn 
     * 2018年6月8日-上午11:12:14
     */
  	public static double max(String val)
  	{
  		double result = 0;
  		if(val.contains("-"))
  		{
  			result = 0;
  		}else{
  			result = round(Double.parseDouble(val));
  		}
  		return result;
  	}
  	
  	/**
  	 * excel round函数
  	 * round   
  	 * @param val
  	 * @return   
  	 * double  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:12:20
  	 */
  	public static double round(double val)
  	{
  		double result = 0;
  		if(val!=0)
  		{
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			result = Double.parseDouble(df.format(val));
  		}
  		return result;
  	}
  	
  	/**
  	 * 月份减1
  	 * monthminus   
  	 * @param month
  	 * @return
  	 * @throws ParseException   
  	 * String  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:12:25
  	 */
  	public static String monthminus(String month)
  	{
  		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");  
  		Date date = null;  
  		try {  
  			date = sdf.parse(month.substring(0, 4)+"-"+month.substring(4, 6)+"-"+"01");  
  		} catch (ParseException e) {  
  			log.error("公共方法月份减1异常", e);  
  		}  
  		Calendar cl = Calendar.getInstance();  
  		cl.setTime(date);  
  		cl.add(Calendar.MONTH, -1);  
  		date = cl.getTime(); 
  		return sdf.format(date).replace("-", "");
  	}
  	
  	/**
  	 * 月份减多个
  	 * monthminuss   
  	 * @param month
  	 * @return
  	 * @throws ParseException   
  	 * String  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:12:25
  	 */
  	public static String monthminuss(String times,int num) throws ParseException
  	{
  		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");  
  		Date date = null;  
		date = sdf.parse(times.substring(0,4)+"-"+times.substring(4,6)+"-"+"01");  
  		Calendar cl = Calendar.getInstance();  
  		cl.setTime(date);  
  		cl.add(Calendar.MONTH, -num);  
  		date = cl.getTime(); 
  		return sdf.format(date).replace("-", "");
  	}
  	
  	/**
  	 * excel  abs函数
  	 * abs   
  	 * @param val
  	 * @return   
  	 * double  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:12:31
  	 */
  	public static double abs(String val)
  	{
  		double result = 0;
  		if(Double.parseDouble(val.replace("-", ""))!=0)
  		{
  			val = val.replace("-", "");
  			DecimalFormat df = new DecimalFormat("#.00"); 
  			result = Double.parseDouble(df.format(Double.parseDouble(val)));
  		}
  		return result;
  	}
  	
  	/**
  	 * excel  iif函数
  	 * abs   
  	 * @param val
  	 * @return   
  	 * double  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:12:31
  	 */
  	public static double iif(String val)
  	{
  		double result = 0;
  		if(val.contains("-"))
  		{
  			result = round(Double.parseDouble(val.replace("-", "")));
  		}else{
  			result = 0;
  		}
  		return result;
  	}
  	
  	/**
  	 * double 转 BigDecimal
  	 * convert   
  	 * @param val
  	 * @return   
  	 * BigDecimal  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年6月8日-上午11:45:45
  	 */
  	public static BigDecimal convert(Object val)
  	{
  		return BigDecimal.valueOf(Double.parseDouble(val.toString())).setScale(2,BigDecimal.ROUND_HALF_UP);
  	}
  	
  	/**
  	 * 获取上月最后一天
  	 * lastmonthday   
  	 * @param month
  	 * @return   
  	 * String  
  	 * 陈龙 - chenlong@sys-test.com.cn 
  	 * 2018年7月6日-下午4:19:22
  	 */
  	public static String lastmonthday(String month)
  	{
  		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  		Date date = null;  
  		try {  
  			date = sdf.parse(month.substring(0, 4)+"-"+month.substring(4, 6)+"-"+"01");  
  		} catch (ParseException e) {  
  			log.error("公共方法获取上月最后一天异常", e);  
  		}  
  		Calendar cl = Calendar.getInstance();  
  		cl.setTime(date);  
  		cl.add(Calendar.MONTH, -1);  
  		date = cl.getTime(); 
  		
  		Calendar c = Calendar.getInstance(); 
  		c.setTime(date);
  	    int maxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
  	    //按你的要求设置时间
  	    c.set( c.get(Calendar.YEAR), c.get(Calendar.MONTH), maxDay, 23, 59, 59);
  		return sdf.format(c.getTime()).replace("-", "");
  	}
  	
}